import {Graph} from "@antv/x6"

const DEFAULT_GRAPH_CONFIG: Graph.Options = {
    grid: true,
    panning: true,
    mousewheel: true,
    autoResize: true,
    background: {
      color: "transparent",
    },
    //
    connecting: {
      snap: true,
      allowNode: false, // 不允许直接连接节点
      allowLoop: false, // 不能连接自身
      allowMulti: false, // 两个节点之间不能有多条连线
      allowBlank: false, // 不允许连接到空白画布
      allowEdge: false, // 不允许连接到边
      highlight: true,
      router: {
        name: 'normal',
        args: {
          startDirections: ['right'],
          endDirections: ['left'],
          padding:20,
        },
      },
      connector: {
        name: 'smooth',
        args: {
          radius: 2,
        },
      },
      validateMagnet({ magnet }) {
        // 节点左边的连接桩无法创建连线
        return magnet.getAttribute('port-group') !== 'left'
      },
      validateConnection({
        sourceCell,
        targetCell,
        sourceMagnet,
        targetMagnet,
        edge
      }) {
        const spgs = sourceMagnet?.getAttribute('port')?.split('.')
        const tpgs = targetMagnet?.getAttribute('port')?.split('.')
  
        // [in|out].[name].[number]
        // 如果没有连接桩，则不允许连线
        if (!spgs || !tpgs) {
          return false;
        }
        // 起始边规则
        if (['in','0'].includes(spgs[0])) {
          return false;
        }
        // 目标边规则
        if (['out','0'].includes(tpgs[0])) {
          return false;
        }
        // 耦合规则 类型判断 当起始连接桩限定了类型时，则只有特定类型的连接桩才可以连接 如果 类型是 0 则标识不限制类型，可以连任意类型的连接桩或者被任意类型的连接桩连接
        if ((spgs[1] || tpgs[1]) && spgs[1] != '0' && tpgs[1] != '0' && spgs[1] != tpgs[1]) {
          return false;
        }
        const edges = this.getEdges().filter(e => e != edge);
        const sen = edges.filter(e => e.getSourceCell() == sourceCell).length;
        const ten = edges.filter(e => e.getTargetCell() == targetCell).length;
        // 出边数量判断
        if (spgs[2] && Number(spgs[2]) && sen >= Number(spgs[2])) {
          return false;
        }
        // 入边数量校验
        if (tpgs[2] && Number(tpgs[2]) && ten >= Number(tpgs[2])) {
          return false;
        }
  
        return true
      },
      createEdge(){ return this.createEdge({shape:'default-edge'})}
    },
    highlighting: {
      // 连接桩可以被连接时在连接桩外围围渲染一个包围框
      magnetAvailable: {
        name: 'stroke',
        args: {
          // className:"x6-highlighted"
          attrs: {
            fill: '#A4DEB1',
            stroke: '#A4DEB1',
            strokeWidth: 2,
          },
        },
      },
      // 连接桩吸附连线时在连接桩外围围渲染一个包围框
      magnetAdsorbed: {
        name: 'stroke',
        args: {
          attrs: {
            fill: '#fff',
            stroke: '#31d0c6',
            strokeWidth: 2,
          },
        },
      },
    },
    preventDefaultContextMenu:true,
    preventDefaultBlankAction:true,
    async:true,
    virtual:true,
    interacting:false,
  }


  export default DEFAULT_GRAPH_CONFIG;